package exercise;

import java.util.HashMap;

/*
3.基础题目
a.给定一个整数数组nums，编写一个程序，统计数组中每个数字出现的次数，并将结果输出
0 1 2 3 4 5 6 7 8 9 10
 */
public class ex1 {
    public static void main(String[] args) {
//        test1(new int[]{9, 1, 3, 3, 1, 0, 1, 9, 100});
//        System.out.println();
//        test5(new int[]{9, 1, 3, 3, 1, 0, 1, 9, 100});
//        System.out.println();
//        test2(new int[]{9, 1, 3, 3, 1, 0, 1, 9, 100});
//        System.out.println();
//        test3();
    }

    public static void test5(int[] nums) {
        int index = 0;//统计不同数字的个数
        int[] values = new int[nums.length];//存储不同数字
        int[] counts = new int[nums.length];//出现的次数
        boolean[] visited = new boolean[nums.length];//标记当前i元素是否已经统计过
        for (int i = 0; i < nums.length; i++) {
            if (!visited[i]) {
                int count = 1;
                visited[i] = true;
                for (int j = i + 1; j < nums.length; j++) {
                    if (nums[i] == nums[j]) {
                        count++;
                        visited[j] = true;
                    }
                }
                values[index] = nums[i];
                counts[index] = count;
                index++;
            }

        }
    }

    private static void test3() {
        int[] nums = {9, 1, 3, 3, 1, 0, 1, 9, 100};        //假设数字范围0-100
        int[] count = new int[101];
        for (int i : nums)
            count[i]++;

        for (int i = 0; i < count.length; i++) {
            if (count[i] != 0) {
                System.out.println(i + "出现了" + count[i] + "次");
            }
        }
    }

    public static void test1(int[] nums) {
        boolean[] b = new boolean[nums.length];
        int[] values = new int[nums.length];
        int[] counts = new int[nums.length];
        //9, 1, 3, 3, 1, 0, 1, 9, 100
        int index = 0;
        for (int i = 0; i < nums.length; i++) {
            if (!b[i]) {//未添加过
                values[index] = nums[i];
                counts[index] = 1;
                //标记当前i元素已经统计过
                for (int j = 0; j < nums.length; j++) {
                    if (nums[i] == nums[j]) {
                        b[j] = true;
                    }
                }
                index++;
            } else {//添加过
                for (int j = 0; j < index; j++) {
                    if (nums[i] == values[j]) {
                        counts[j] = counts[j] + 1;
                    }
                }
            }
        }
        for (int i = 0; i < index; i++) {
            System.out.println("元素:" + values[i] + ":" + counts[i]);
        }
    }

    public static void test2(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i : nums) map.put(i, map.getOrDefault(i, 0) + 1);
        map.forEach((k, v) -> System.out.println(k + "出现了" + v + "次"));
    }

    public static void test4(int[] nums) {
        //不用集合 不用排序 只使用数组 如何实现
        //比较难
        //用于标记 数组的元素是否 统计过
        boolean[] b = new boolean[nums.length];
        //再创建两个数组 一个存储不同的数组  一个存储对应次数
        int[] values = new int[nums.length];
        int[] counts = new int[nums.length];
        //遍历数组  统计每次数组元素的次数
        int index = 0;//记录有几个不同元素的下标
        for (int i = 0; i < nums.length; i++) {
            if (!b[i]) {//如果没有统计才需要进入if
                int count = 1;//初始化次数
                b[i] = true;//标记当前i元素已经统计过
                for (int j = i + 1; j < nums.length; j++) {
                    if (nums[j] == nums[i]) { //发现一样的了
                        count++;//次数+1
                        b[j] = true;//标记已统计
                    }
                }
                //最后当前i元素统计完了 记录次数
                values[index] = nums[i];
                counts[index] = count;
                index++;//统计下一个不同的元素
            }
        }
//        [3,5,7,0,0,0,0]
//        [1,2,3,0,0,0,0]
        for (int i = 0; i < index; i++) {
            System.out.println("元素:" + values[i] + ":" + counts[i]);
        }
    }

}
